#ifndef THREADPOOL_H
#define THREADPOOL_H

#include <pthread.h>

#include "list.h"
#include "dynamicarray.h"
#include "delegate.h"

/**
 * @brief The s_ThreadPool struct
 */
struct s_ThreadPool
{
    /** @brief tableau dynamique de pthread_t representant les thread du pool*/
    DynamicArray threads;
    /** @brief liste chainée de Deleguate representant
     * la liste des fonctions en attente d'execution par le pool de thread*/
    List events;
    /** @brief mutex permetant la synchronisation de l'accès
     * aux membres de la structure par les différents threads du poll*/
    pthread_mutex_t mutex;
    /** @brief nombre de thread contenus dans le pool*/
    int count;
} typedef ThreadPool;

/**
 * @brief threadpool_create
 * @param threadpool créer et initialise un pool de thread
 * @param count
 */
void threadpool_create(ThreadPool** threadpool, int count);

/**
 * @brief threadpool_initialize initialise le pool de thread en lancant <count> threads
 * qui attendent de recevoir et traiter les fonctions entrantes.
 * @param threadpool
 * @param count nombre de thread à initialiser
 */
void threadpool_initialize(ThreadPool* threadpool, int count);

/**
 * @brief threadpool_clear detruit le pool de thread en quittant proprement chacun des threads
 * @param threadpool
 */
void threadpool_clear(ThreadPool* threadpool);

/**
 * @brief threadpool_destroy désaloue et détruit le pool de thread proprement
 * @param threadpool
 */
void threadpool_destroy(ThreadPool** threadpool);

/**
 * @brief threadpool_execute execute de manière ansynchrone sur le premier thread du pool disponible la fonction passée en argument
 * @param threadpool
 * @param event Délégué contenant la fonction a executée ainsi que ces argument.
 */
void threadpool_execute(ThreadPool* threadpool, Delegate** event);

#endif /* THREADPOOL_H*/
